#ifndef BOATCONTROLLER_H
#define BOATCONTROLLER_H

#include <iostream>
#include <list>
#include <csignal>

using namespace std;
//pid 参数
struct mPidParameter{
    float kp = 0.0;
    float kd = 0.0;
};

// nvagiation info 导航信息
struct mNavigation
{
    float hdg{0.0};//set HDG def 艏向角
    float cog{0.0};//set COG deg 对地航向角
    float rot{0.0};//set ROT deg/s 每秒钟角速度
    double lon{120.0};//set lon 经度
    double lat{41.1};//set lat 纬度
    float actual_velocity{0.0};//get actual knot 速度 节
    float depth{0.0};//get depth m 深度 米
    float pitch{0.0};//get pitch deg
    float roll{0.9};// get roll deg
    float heave_velocity{0.02};//get heave velocity m/s
};

// control info 控制信息
struct mControl{
    float set_velocity{0.0};//set speed knot 速度 节

};

struct mPoint2D{
    double x{0.0};
    double y{0.0};
};

//boat control class
//船控制类
class BoatController
{
public:
    BoatController();

    /**
     * @brief PID_method 位置式数字PID控制器
     * @param para PID控制参数
     * @param error 跟踪偏差
     * @param result 控制量计算结果
     */
    void position_pid_method(const mPidParameter& para, const float& error, float &result);

    void los_path_tracking_loop(const list<mPoint2D>& path);

    void pp_path_tracking_loop();

    /**
     * @brief rudder_signal_handler 如果舵角计算完毕将发出signal, 收到signal执行
     * @param signal
     */
    void rudder_signal_handler(int signal);

    void rsp_signal_handler(int signal);

private:
    list<mPoint2D> path;

    mPidParameter _velocity_pid_para;//速度pid参数
    mPidParameter _head_pid_para;//航向pid参数

    mNavigation _navi_info;
    mControl _control_info;
};

#endif // BOATCONTROLLER_H
